package com.fufu.thread;

/**
 * 线程的中断：使用running标志位进行判断
 * @author: BlcakTiger
 * @date: 2023/2/10 16:08
 * @contact: hsf6661@163.com
 */
public class TheOtherInterrupt {

    public static void main(String[] args) throws InterruptedException {
        //向上转型：父类引用子类对象
        Thread t = new MT();
        //启动t线程
        t.start();
        //主线程阻塞3毫秒，期间将cpu的调度权给予t线程
        Thread.sleep(1);
        //向下转型获取T类中的中断标志位running，将其设置为false，
        ((MT) t).running = false;
    }
}

class MT extends Thread{
    /**
     * running为线程的共享变量，当开启多个线程，每个线程都会获取变量的一个副本，如果线程修改了变量的值，那么jvm会在某个时刻将修改后的值重写回
    *主内存，但是这个时间是不确定的，从而会导致其他线程读取到当前线程未修改前的值
    *而volatile就是用来解决这个问题的， 它会让被修改后的变量立刻写入主内存，从而保持所有线程的running变量值一致
    */
    public volatile  boolean running = true;

    @Override
    public void run() {
        while (running){
            System.out.println(this.getName()+"running...");
        }
    }
}
